package com.itheima.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;
import java.util.Map;

/**
 * JWT 令牌操作工具类
 */
public class JwtUtils {

    // 生成 JWT 令牌时使用的密钥，与测试类中保持一致
    private static final String SECRET_KEY = "aXRoZWltYQ==";

    // 令牌过期时间：7天 (单位：毫秒)
    private static final long EXPIRATION_TIME = 7 * 24 * 60 * 60 * 1000;

    /**
     * 生成 JWT 令牌
     *
     * @param claims 包含需要放入令牌中的自定义信息（如用户ID、用户名等）的 Map
     * @return 生成的 JWT 令牌字符串
     */
    public static String generateToken(Map<String, Object> claims) {
        return Jwts.builder()
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY) // 指定签名算法和密钥
                .addClaims(claims) // 添加自定义声明（Claims）
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) // 设置过期时间
                .compact(); // 构建并返回紧凑的 JWT 字符串
    }

    /**
     * 解析 JWT 令牌
     *
     * @param token 需要解析的 JWT 令牌字符串
     * @return 包含令牌中所有声明（Claims）的 Claims 对象
     * @throws io.jsonwebtoken.ExpiredJwtException 如果令牌已过期
     * @throws io.jsonwebtoken.MalformedJwtException 如果令牌格式不正确
     * @throws io.jsonwebtoken.SignatureException 如果签名验证失败
     * @throws io.jsonwebtoken.UnsupportedJwtException 如果令牌不被支持
     * @throws IllegalArgumentException 如果传入的 token 为 null 或空字符串
     */
    public static Claims parseToken(String token) {
        return Jwts.parser()
                .setSigningKey(SECRET_KEY) // 设置用于验证签名的密钥
                .parseClaimsJws(token) // 解析 JWT 令牌（JWS - JSON Web Signature）
                .getBody(); // 获取令牌的载荷（Payload）部分，即 Claims
    }
}